iT邦幫忙

2024 iThome 鐵人賽

DAY 9
0
AI/ ML & Data

使用 jq 處理資料系列 第 9

Day9 : jq filter 條件式

  • 分享至 

  • xImage
  •  

昨天我們學到 |select(),今天來認識常用的條件式吧~

對話中學習

師傅:好,看來你已經準備好迎接更大的挑戰了。讓我們來談談 jq filter 中的條件式。

徒弟:條件式?是不是像我們之前用的 select?

師傅:沒錯,select() 是一個內建函式,它接受一個條件式或布林值作為參數。條件式就是運算結果為布林值的運算式,條件式中一般都會使用比較運算子。我們來看看一些常見用於條件式的比較運算子:

  • 等於:==
  • 不等於:!=
  • 大於:>
  • 小於:<
  • 大於等於:>=
  • 小於等於:<=
  • 且:and
  • 或:or
  • 非:not

徒弟:哇!這些看起來很強大啊!我可以試試嗎?

師傅:當然可以。試著從 TODO 陣列中,找出 id 大於 150 且未完成的 TODO。

徒弟:讓我想想...是這樣嗎?jq ".[] | select(.id > 150 and .completed == false) | .title" todos.json

師傅:做得好。你的理解很準確。

徒弟:謝謝師傅!我感覺自己對 jq 的理解又深入了一層。

師傅:很好。記住,實踐出真知。多嘗試不同的組合,你會發現更多有趣的用法。

徒弟:是的,師傅!我會努力練習的!


判斷等於 ==

jq 條件式會使用到的比較運算子大部分都很直觀通用,比較要注意的反而是 == 等於這個比較的寫法。

如果 a 和 b 在 JSON 定義中的型別皆相等,那麼 a==b 這個條件是運算的結果是 true。如果是 javascript 的開發者應該會知道,這樣的條件式在 javascript 裡面是 a===b;也就是說 jq 運算式當中的 a==b 等同於 javascript 中的 a===b

找出 id 大於 150 且未完成的 TODO

拆解這段條件式如下:

  • id 大於 150: id > 150
  • 且: and
  • 未完成: .completed == false

最後再將這段條件是當作 select() 函式的輸入參數,滿足這個條件的物件才會輸出,成為 .title 這段 filter 的輸入值,藉此條件篩選出想要的結果。

jq ".[] | select(.id > 150 and .completed == false) | .title" todos.json

結論

今天認識了 jq filter 條件式中常用的判斷運算子,在我學習之前,從沒有想過這麼常見的判斷用法也可以寫在 jq filter 裡面,搭配輸入陣列 iterator 和 | ,既簡潔又快速地達成篩選資料的效果。感謝今天自己也認真的學習~學而時習之,不亦悅乎。


上一篇
Day8: jq filter 組合使用 pipe
下一篇
Day10: jq filter 建立新物件/陣列
系列文
使用 jq 處理資料30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言